package com.ycdr.leetcode.array;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.LinkedList;

/**
 * 
 * 给定一个由整数组成的非空数组所表示的非负整数，在该数的基础上加一。
 * 最高位数字存放在数组的首位， 数组中每个元素只存储一个数字。
 * 你可以假设除了整数 0 之外，这个整数不会以零开头。
 * 
 * 示例 1:
 *  输入: [1,2,3]
 *  输出: [1,2,4]
 *  解释: 输入数组表示数字 123。
 * 
 * 示例 2:
 *  输入: [4,3,2,1]
 *  输出: [4,3,2,2]
 *  解释: 输入数组表示数字 4321。
 *  
 * @deprecated 加一
 * @author yc 颍川
 */
public class PlusOne {
    
    public static void main(String[] args) {
        int[] t=new int[]{9,9};
        plusOne(t);
    }

    /**
     * 思路分析:
     *   1. 判断最后一位是否为9 为9则需要进一位，其他位判断类似
     */
    public static int[] plusOne(int[] digits) {
       int length=digits.length;
       LinkedList<Integer> list=new LinkedList<>();
       LinkedList<Integer> list1=new LinkedList<>();
       for (int i = 0; i < length; i++) {
           list1.add(digits[i]);
       }
       int k=1;
       for (int i = length-1; i >=0; i--) {
            int t=list1.get(i)+k;
            if(k==1&&t>9){
                if(i==0){
                    list.add(0);
                    list.add(1);
                }else{
                    list.add(0);
                }
            }else{ 
                list.add(t);
                k=0;
            }
       }
       int le=list.size();
       int[] t=new int[le];
       for (int i = 0; i < list.size(); i++) {
           t[--le]=list.get(i);
       }
       return t;
    }


 
    /**
     * 思路分析: 倒叙数组,循环执行，如果值小于9则值加１退出循环,否则值变为0，继续执行
     * [1,2,3]
     * @param digits
     * @return
     */
    public int[] plusOne1(int[] digits) {
        for (int i = digits.length-1; i >=0 ; i--) {
            if(digits[i]<9){
                digits[i]+=1;
                break;
            }else{
                digits[i]=0;
            }
        }
        if(digits[0]==0){
            int[] dgs=new int[digits.length+1];
            dgs[0]=1;    
            return dgs;
        }
        return digits;
    }


    /**
     * 思路分析: 倒叙数组,循环执行，值加１，然后在让值除10取余,如果余不等０，则直接返回当前数组,否则继续执行
     * 
     * @param digits
     * @return
     */
    public int[] plusOne2(int[] digits) {
        int len = digits.length;
        for (int i = len - 1; i >= 0; i--) {
            digits[i]++;
            digits[i] = digits[i] % 10;
            if (digits[i] != 0) return digits;
        }
        digits = new int[len + 1];
        digits[0] = 1;
        return digits;
    }

    public int[] plusOne3(int[] digits) {
        StringBuilder builder=new StringBuilder();
        Arrays.stream(digits).forEachOrdered(value -> {
            builder.append(value);
        });
        BigDecimal temp=new BigDecimal(builder.toString()).add(new BigDecimal(1));
        String[] strings = temp.toString().split("");
        int[] ints = new int[strings.length];
        for (int i = 0; i < strings.length; i++) {
            ints[i]= Integer.parseInt(strings[i]);
        }
        return ints;
    }
}